/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Expressoes;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author linton
 */
public class RegraElementoVar extends Regra{

    protected static Regra instancia;
    protected static String estrutura= " <elemento_var> ::= identificador [ <exp_aritmetica> ]  <elemento_struct>";

    
    /**
     * Construtor privado necessario ao singleton
     */
    private RegraElementoVar() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraElementoVar getInstance() {
        if (instancia == null) {
            instancia = new RegraElementoVar();
        }
        return (RegraElementoVar) instancia;
    }

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
          NoArvore naoterminalElemento = new NoArvore("<elemento_var>", false);
          naoterminalElemento.adicionaFilho(reconheceToken(listaTokens, "identificador",estrutura));
        while(listaTokens.getFirst().getLexema().equals("[")){
            naoterminalElemento.adicionaFilho(reconheceLexema(listaTokens, "delimitador","[",estrutura));
            NoArvore elemento = reconhecerNaoTerminal(listaTokens,RegraExpAritmetica.getInstance());
            if(elemento!=null) naoterminalElemento.adicionaFilho(elemento);
            else {} //ERRO
            naoterminalElemento.adicionaFilho(reconheceLexema(listaTokens, "delimitador","]",estrutura));
        }
        NoArvore elemento = reconhecerNaoTerminal(listaTokens,RegraElementoStruct.getInstance());
        while(elemento!=null){
          naoterminalElemento.adicionaFilho(elemento);
          elemento = reconhecerNaoTerminal(listaTokens,RegraElementoStruct.getInstance());
        }

    return naoterminalElemento;
    }

    

    @Override
    protected void setPrimeiro() {
        //P<elemento_var>  = identificador
        this.primeiro.add("identificador");

    }

    @Override
    protected void setSeguinte() {
        //S<elemento_var>   = S<variavel>
        //S(variavel) = {"="}
        //this.primeiro = RegraVariavel.getInstance().getSeguinte();
        this.seguinte.add("=");
    }

   
}
